package com.sdk.es.http.service.base;



import com.sdk.es.sdk.entity.common.EsBaseParams;
import com.sdk.es.sdk.entity.common.EsPageReq;
import com.sdk.es.sdk.entity.common.EsPageResult;
import com.sdk.es.sdk.entity.common.GroupByResp;

import java.util.List;

/**
 * @author wst
 * @date 2024/1/31
 *
 * 父类 Service
 * @param <E>   具体索引实体
 */
public interface IEsBaseService<E> {

    /**
     * 新增
     * @param req   新增数据
     * @return  新增数据
     */
    E save(E req);

    /**
     * 新增异步
     * @param req   新增数据
     */
    void saveAsync(E req);

    /**
     * 批量新增
     * @param list   新增数据数组
     * @return  新增数据数组
     */
    List<E> saveBatch(List<E> list);

    /**
     * 批量新增异步
     * @param list   新增数据数组
     */
    void saveBatchAsync(List<E> list);

    /**
     * 更新
     * @param req   更新数据，通过 ID
     */
    void update(E req);

    /**
     * 更新异步
     * @param req   更新数据，通过 ID
     */
    void updateAsync(E req);

    /**
     * 删除
     * @param req   删除数据，通过 ID
     */
    void delete(E req);


    /**
     * 删除异步
     * @param req   删除数据，通过 ID
     */
    void deleteAsync(E req);

    /**
     * 根据ID查询
     * @param req   ID 必传
     * @return  查询结果
     */
    E getById(E req);

    /**
     * 查询单个,返回多个报错
     * @param req   查询参数
     * @return  查询结果
     */
    E getOne(EsBaseParams<E> req);

    /**
     * 查询列表，限制最多1000条返回
     * @param req   查询参数
     * @return  查询结果数组
     */
    List<E> getList(EsBaseParams<E> req);

    /**
     * 分页查询
     * @param pageReq   查询参数，分页参数
     * @return  查询结果，分页实体
     */
    EsPageResult<E> page(EsPageReq<E> pageReq);
    /**
     * 查询统计数量
     * @param req   查询参数
     * @return  查询结果
     */
    Long count(EsBaseParams<E> req);

    /**
     * 分组查询，最大返回一千记录，如需查询更多，使用分页接口
     * @param req
     * @return
     */
    List<GroupByResp> groupBy(EsBaseParams<E> req);

    /**
     * 分组查询分页
     * @param pageReq
     * @return
     */
    EsPageResult<GroupByResp> groupByPage(EsPageReq<E> pageReq);

    /**
     * 对单个字段值求和，用于统计
     * @param req
     * @return
     */
    Double sum(EsBaseParams<E> req);
}
